//
// Created by wujehy on 2020/5/22.
//

#ifndef GEEJOAN_CONSISTENCYCIPTHER_H
#define GEEJOAN_CONSISTENCYCIPTHER_H

/**
 * @brief 协商加密器 DH 算法
 *  使用我的私钥 和对方的公钥 协商 的信息 仅 能通过我的公钥 和对方的私钥 解开
 * 参见 测试案例中 testKeyPair.cpp
 * @pre 依赖 KeyPairData 和 SecurityCommon 模块
 */
#include <string>
#include "KeyPairData.h"
namespace GeeJoan
{
    namespace Common
    {

        typedef void (*CpitherCallbackFunction)(void *data, int data_len, void *userdata); ///< 加解密 回调函数
        class CiptherBase
        {
        protected:
            /**
             * @brief 加密操作
             * @param inputString 输入流
             * @param key AES Key
             * @param vi
             * @param callback 加密成功回调
             * @param userdata
             * @return
             */
            int EnCipther(
                    std::string &inputString, std::string &key,
                    std::string &vi,
                    CpitherCallbackFunction callback,
                    void *userdata = nullptr);

            /**
             * @brief  解密操作
             * @param inputString  输入流
             * @param key AES Key
             * @param vi
             * @param callback 回调
             * @param userdata
             * @return
             */
            int DeCipther(
                    std::string &inputString, std::string &key,
                    std::string &vi,
                    CpitherCallbackFunction callback,
                    void *userdata = nullptr);
        };

        // TODO  一致性
        class ConsultCipther :public CiptherBase
        {
        private:
            KeyPairData m_keypair;
        public:
            /**
             * @brief 使用密钥对构协商加密器
             * @param mKeypair 密钥对
             */
            ConsultCipther(const KeyPairData &mKeypair);

            /**
             * @brief 使用对方的 公钥 加密信息
             * @param[in] inString 需要加密的原文
             * @param[in] otherpublicKey 对方的公钥
             * @param output[out] 输出的密文
             * @return
             */
            int ConsultEnCipther(std::string &inString , std::string &otherpublicKey , std::string &output);

            /**
             * @brief 使用对方的 公钥 解密信息
             * @param[in] inString 需要解密的原文
             * @param[in] otherpublicKey 对方的公钥
             * @param output[out] 输出的原文
             * @return
             */
            int ConsultDeCipther(std::string &inString , std::string &otherpublicKey , std::string &output);

        };
    }
}


#endif //GEEJOAN_CONSISTENCYCIPTHER_H
